/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cliente.negocio;

import cliente.comunicacion.Proxy;
import cliente.presentacion.administrador.gestionusuario.JF_AddUsuario;
import cliente.presentacion.administrador.gestionusuario.JF_Gestion_Usuarios;
import cliente.presentacion.administrador.gestionusuario.JF_ModificarUsuario;
import cliente.presentacion.administrador.gestionusuario.JF_VerUsuarios;
import cliente.presentacion.administrador.gestionusuario.iJF_Gestion_Usuarios;
import cliente.presentacion.administrador.gestionusuario.iJF_ModificarUsuario;
import cliente.presentacion.administrador.gestionusuario.iJF_VerUsuario;
import cliente.presentacion.administrador.gestionusuario.iJF_AddUsuario;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import server.dominio.Centro;
import server.dominio.DescripcionRol;
import server.dominio.Medico;
import server.dominio.Usuario;
import server.excepciones.MedicoInexistenteException;
import server.excepciones.MedicoNoExistenteException;
import server.excepciones.MedicoYaExistenteException;
import server.excepciones.UsuarioYaExistenteException;

/**
 *
 * @author tpaxle
 */
public class Controlador_Gestion_Usuarios implements iControlador_Administrador{
    private iJF_Gestion_Usuarios ventana_gestionUsuarios;
    private iJF_VerUsuario ventana_jf_verusuario;
    private iJF_AddUsuario ventana_jf_addusuario;
    private iJF_ModificarUsuario ventana_jf_modificarusuario;
    private Proxy proxy;
    private ArrayList<Usuario> listausuarios;
    private ArrayList<Centro> listacentros;
    private Controlador_Administrador C_admin;
    private boolean[] Centrosrecibidos= {false, false};
    private Usuario usuario_nomodificado;
    public Controlador_Gestion_Usuarios(Controlador_Administrador C_admin){
        ventana_gestionUsuarios= new JF_Gestion_Usuarios(this);
        ventana_jf_verusuario= new JF_VerUsuarios(this, -1);
        proxy= Proxy.getProxy();
        this.C_admin=C_admin;
        this.obtenerUsuarios();
    }


    private void obtenerUsuarios() {
        proxy.getDatosTablas(C_admin.getIdSesion());
    }

    public void entregarUsuariosrecibidos(ArrayList<Object> usuarios, ArrayList<Object> beneficiarios) {
         ArrayList<Usuario> listausuario = new ArrayList<Usuario>();
        for(Object a: usuarios){
            listausuario.add((Usuario)a);
        }
        this.listausuarios= listausuario;

        ventana_gestionUsuarios.iniciartablausuario(listausuarios);
        ventana_gestionUsuarios.mostrar(true);

    }

    public boolean accesoposibleCentros() {
        if(!Centrosrecibidos[0]){
            if(!Centrosrecibidos[1]){
                this.obtenerCentros();
                Centrosrecibidos[1]= true;
            }
        }
        return Centrosrecibidos[0];
    }
    

    public void mostrarUsuario(int index) {
        ventana_jf_verusuario.mostrar(listausuarios.get(index), index);
    }

    public void nuevousuario() {
        ventana_jf_addusuario= new JF_AddUsuario(this);
        ventana_jf_addusuario.mostrar(true);
        this.C_admin.getAdmin_Control().log("Abrir ventana Nuevo Usuario");
    }

    public void borrarusuario(int index) {
        Usuario usuario= listausuarios.get(index);
        try {
        if(usuario.getRol().getIdRol_pk() != 3){
             proxy.borrarUsuario(C_admin.getIdSesion(), usuario);
        }else{

                Medico medico_aux = proxy.getMedico(C_admin.getIdSesion(), usuario.getNif());
                proxy.borrarMedico(C_admin.getIdSesion(), medico_aux);
                //actualizar
        }
            } catch (MedicoNoExistenteException ex) {
        this.C_admin.getAdmin_Control().log("No se puede borrar el medico " + usuario);
        ventana_gestionUsuarios.error(4);
    } catch (MedicoInexistenteException ex) {
        this.C_admin.getAdmin_Control().log("No se puede borrar el medico " + usuario);
        ventana_gestionUsuarios.error(4);
    } catch (Exception ex){
        this.C_admin.getAdmin_Control().log("No se puede borrar el medico " + usuario);
        ventana_gestionUsuarios.error(4);
    }
    }
    private void obtenerCentros() {
        proxy.getCentros(C_admin.getIdSesion());
    }



    public void modificarusuario(int index) {
        Usuario usuario= listausuarios.get(index);
        try {
            if (usuario.getRol().getIdRol_pk() == 3) {
                usuario_nomodificado = proxy.getMedico(this.C_admin.getIdSesion(), usuario.getNif());
            }else
                usuario_nomodificado = usuario;
            ventana_jf_modificarusuario = new JF_ModificarUsuario(this);
            ventana_jf_modificarusuario.mostrar(true);
            ventana_jf_modificarusuario.mostrarusuario(usuario);
          if(usuario.getRol().getIdRol_pk()==3)
              ventana_jf_modificarusuario.mostrar((Medico)usuario_nomodificado);

        } catch (MedicoInexistenteException ex) {
              this.C_admin.getAdmin_Control().log("No se puede borrar el medico " + usuario);
              ventana_jf_modificarusuario.error(3);
        } catch (Exception ex){
              this.C_admin.getAdmin_Control().log("No se puede borrar el medico " + usuario);
              ventana_jf_modificarusuario.error(2);
        }
    }

    public void entregarCentros(ArrayList<Object> centros) {
        ArrayList<Centro> listascent= new ArrayList<Centro>();

        for(Object c: centros){
            listascent.add((Centro) c);
        }
        listacentros= listascent;
        Centrosrecibidos[0]= true;
    }

    public void nuevousuario(String[] informacion) {
        boolean creado = false;
        if(informacion.length> 11){
            //Si es un medico
            Medico medico= new Medico(new Usuario(informacion[2],informacion[3],informacion[4],informacion[5],Integer.parseInt(informacion[7]), Integer.parseInt(informacion[8]), informacion[6], informacion[9], informacion[0], informacion[1], new DescripcionRol(Integer.parseInt(informacion[10]))),Integer.parseInt(informacion[11]), new Centro(1, "hola", "adios", "fin"));
            try {
                proxy.crear(this.C_admin.getIdSesion(), medico);
                ventana_jf_addusuario.cerrar();
                creado= true;
            } catch (MedicoYaExistenteException ex) {
                ventana_jf_addusuario.error(1);
                this.C_admin.getAdmin_Control().log("ERROR AL CRERAR USUARIO (Usuario ya existente): "+ ex);
            }

        }else{
            Usuario usuario= new Usuario(new Usuario(informacion[2],informacion[3],informacion[4],informacion[5],Integer.parseInt(informacion[7]), Integer.parseInt(informacion[8]), informacion[6], informacion[9], informacion[0], informacion[1], new DescripcionRol(Integer.parseInt(informacion[10]))));
            proxy.nuevousuario(this.C_admin.getIdSesion(), usuario);
            ventana_jf_addusuario.cerrar();
        }
    }

    public ArrayList<Centro> getListacentros() {
        return listacentros;
    }

    public void modificarusuario(String[] informacion, int opcion) {
        //En primer lugar se comprueba si hay cambios en los datos Usuario

        Usuario usuario;
        if(informacion.length==13){
            usuario= new Medico(new Usuario(informacion[2],informacion[3],informacion[4],informacion[5],Integer.parseInt(informacion[7]), Integer.parseInt(informacion[8]), informacion[6], informacion[9], informacion[0], informacion[1], new DescripcionRol(Integer.parseInt(informacion[10]))),Integer.parseInt(informacion[11]), new Centro(Integer.parseInt(informacion[12])));
            usuario.setIdUsuario_pk(usuario_nomodificado.getIdUsuario_pk());
            //((Medico)usuario).setIdMedico_pk(((Medico)usuario_modificado).getIdMedico_pk());
        }else{
            usuario= new Usuario(new Usuario(informacion[2],informacion[3],informacion[4],informacion[5],Integer.parseInt(informacion[7]), Integer.parseInt(informacion[8]), informacion[6], informacion[9], informacion[0], informacion[1], new DescripcionRol(Integer.parseInt(informacion[10]))));
            usuario.setIdUsuario_pk(usuario_nomodificado.getIdUsuario_pk());
        }
        if(usuario.getRol().getIdRol_pk()== usuario_nomodificado.getRol().getIdRol_pk() && (usuario.compareTo(usuario_nomodificado)== 0)){
            ventana_jf_modificarusuario.error(1);
        }else{
            try{
                switch(opcion){
                    case 1:
                        Medico medico_aux= new Medico(usuario, ((Medico)usuario_nomodificado).getTipo_medico(), ((Medico)usuario_nomodificado).getCentro());
                        proxy.modificarUsuarioM(C_admin.getIdSesion(), medico_aux);
                        ventana_jf_modificarusuario.cerrar();
                        break;
                    case 2:
                        proxy.modificar(C_admin.getIdSesion(), (Medico)usuario);
                        ventana_jf_modificarusuario.cerrar();
                        break;
                    case 3:
                        proxy.modificarUsuario(C_admin.getIdSesion(), usuario);
                        ventana_jf_modificarusuario.cerrar();
                        break;
                    case 4:
                        proxy.modificarUsuario(C_admin.getIdSesion(), usuario);
                        ventana_jf_modificarusuario.cerrar();
                        break;
                }
            }catch (MedicoNoExistenteException ex){
                ventana_jf_modificarusuario.error(1);
            } catch (MedicoYaExistenteException ex){
                ventana_jf_modificarusuario.error(2);
            } catch (UsuarioYaExistenteException ex){
                ventana_jf_modificarusuario.error(2);
            } catch (Exception ex){
                ventana_jf_modificarusuario.error(3);
            }
        }
    }

    public void notificar(int noperacion, Object objeto) {
        if(objeto!= null){
            Usuario usuario_aux= (Usuario)objeto;
            switch(noperacion){
                case 1:
                    //Insercion de usuario
                    listausuarios.add(usuario_aux);
                    ventana_gestionUsuarios.iniciartablausuario(listausuarios);
                    //Nuevo Usuario
                    break;
                case 2:
                    //Eliminacion Usuario

                    if((usuario_aux=buscarusuario(usuario_aux))!= null){
                        listausuarios.remove(usuario_aux);
                        ventana_gestionUsuarios.iniciartablausuario(listausuarios);

                    }
                    break;
                    //Modificacion Usuario
                case 3:
                    notificarmodificarusuario(usuario_aux);
                    break;
                case 11:
                    ventana_gestionUsuarios.error(3);
                    break;
                case 12:
                    ventana_gestionUsuarios.error(4);
                    break;

            }
        }else{
            System.out.println("se a producido un error");
        }
    }
    private Usuario buscarusuario(Usuario usu){
        Usuario usuario=null;
        for(int i=0; i< listausuarios.size(); i++){
            if(listausuarios.get(i).getIdUsuario_pk() == usu.getIdUsuario_pk())
                usuario= listausuarios.get(i);
        }
        return usuario;
    }
    private void notificarmodificarusuario(Usuario usuario_aux){
        Usuario auxiliar= null;
        //Modificacion de usuario, el usuario con idSesion igual al actualizado
        //apuntara al nuevo
        if((auxiliar=buscarusuario(usuario_aux))!= null){
            listausuarios.set(listausuarios.indexOf(auxiliar), usuario_aux);
            ventana_gestionUsuarios.iniciartablausuario(listausuarios);
        }
    }

    public void entregarMedicos(ArrayList<Object> medicos) {
        //Ignorar
    }


    /*Indica al Controlador administrador que se ha cerrado*/
    public void cerrar() {
        C_admin.cerrar();
    }

    public void entregarHorario(ArrayList<Object> lhora) {
        //ignorar
    }
}

